
package pe.edu.upc.dew.pharma.dao.mysql;

import java.sql.Types;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;
import org.springframework.stereotype.Repository;
import pe.edu.upc.dew.pharma.dao.ProductoDao;
import pe.edu.upc.dew.pharma.dao.mapper.ProductoMapper;
import pe.edu.upc.dew.pharma.model.Producto;
import pe.edu.upc.dew.pharma.util.StoredProcedurePharma;

@Repository
public class MysqlProductoDao extends SimpleJdbcDaoSupport implements ProductoDao{

	private static final Log logger = LogFactory.getLog(MysqlProductoDao.class);
	
	@Autowired
	public MysqlProductoDao(DataSource dataSource){
		setDataSource(dataSource);
	}
	
	@SuppressWarnings("unchecked")
	public List<Producto> listarProductos(){
		
		List<Producto> listarProductos = new ArrayList<Producto>();
		StoredProcedurePharma sp = new StoredProcedurePharma(getJdbcTemplate(), "sp_listadoProductos");
		Map<String, Object> result = sp.executeProcedure("productos", new ProductoMapper());
		listarProductos = (List<Producto>) result.get("productos");
		return listarProductos;
	}
	
	@SuppressWarnings("unchecked")
	public List<Producto> listarProductosPorCategoria(String idCategoria){
		
		List<Producto> listarProductos = new ArrayList<Producto>();
		StoredProcedurePharma sp = new StoredProcedurePharma(getJdbcTemplate(), "sp_listadoProductosCategoria");
		sp.addInParameter("p_pcategoria", Types.CHAR, idCategoria);
		Map<String, Object> result = sp.executeProcedure("productos", new ProductoMapper());
		listarProductos = (List<Producto>) result.get("productos");
		return listarProductos;
	}

	@SuppressWarnings("unchecked")
	public List<Producto> obtenerProductosStockCritico(int idProveedor) {
		
		if(logger.isInfoEnabled()){
			logger.info("obtenerProductosStockCritico : idProveedor = " + idProveedor );
		}
		
		List<Producto> productos = new ArrayList<Producto>();
		StoredProcedurePharma sp = new StoredProcedurePharma(getJdbcTemplate(), "sp_stock_critico");
		sp.addInParameter("p_proveedor", Types.INTEGER, idProveedor);
		Map<String, Object> result = sp.executeProcedure("productos", new ProductoMapper());
		
		productos = (List<Producto>) result.get("productos");
		
		if(logger.isInfoEnabled()){
			logger.info("resultado = " + productos.size());
		}
		
		return productos;
	}
	
	@SuppressWarnings("unchecked")
	public List<Producto> listarProductosOfertados() {
		List<Producto> listarProductos = new ArrayList<Producto>();
		StoredProcedurePharma sp = new StoredProcedurePharma(getJdbcTemplate(), "sp_listadoProductosOfertados");
		Map<String, Object> result = sp.executeProcedure("productos", new ProductoMapper());
		listarProductos = (List<Producto>) result.get("productos");
		return listarProductos;
	}

	public void actualizarEstadoSolicitudPedido(String idProducto) {
		StoredProcedurePharma sp = new StoredProcedurePharma(getJdbcTemplate(), "sp_actualizar_solicitud_pedido");
		sp.addInParameter("p_idProducto", Types.VARCHAR, idProducto);
		sp.executeProcedure();
	}
	
	@SuppressWarnings("unchecked")
	public Producto obtenerProductoPorId(String idProducto) {
		List<Producto> listarProductos = new ArrayList<Producto>();
		StoredProcedurePharma sp = new StoredProcedurePharma(getJdbcTemplate(), "sp_obtenerProducto");
		sp.addInParameter("p_idProducto", Types.VARCHAR, idProducto);
		Map<String, Object> result = sp.executeProcedure("productos", new ProductoMapper());
		listarProductos = (List<Producto>) result.get("productos");
		Producto producto = (Producto) listarProductos.get(0);
		return producto;
	}

}
